/**
 * 设备ID管理工具
 * 用于生成和管理设备唯一标识，解决多端登录token覆盖问题
 */

/**
 * 获取设备唯一标识
 * @returns {String} 设备ID
 */
export function getDeviceId() {
  // 尝试从本地存储获取设备ID
  let deviceId = uni.getStorageSync('device_id');
  
  // 如果没有，则生成一个新的设备ID
  if (!deviceId) {
    deviceId = generateDeviceId();
    // 保存到本地存储
    uni.setStorageSync('device_id', deviceId);
  }
  
  return deviceId;
}

/**
 * 生成设备唯一标识
 * @returns {String} 生成的设备ID
 */
function generateDeviceId() {
  // 获取系统信息
  const systemInfo = uni.getSystemInfoSync();
  
  // 生成随机数
  const random = Math.random().toString(36).substring(2, 15);
  
  // 获取当前时间戳
  const timestamp = new Date().getTime();
  
  // 组合设备信息生成唯一ID
  const deviceId = [
    systemInfo.platform || 'unknown',
    systemInfo.model || 'unknown',
    systemInfo.system || 'unknown',
    timestamp,
    random
  ].join('_');
  
  // 返回MD5哈希或其他适当的处理
  return stringToHash(deviceId);
}

/**
 * 将字符串转换为简单的哈希值
 * @param {String} str 输入字符串
 * @returns {String} 哈希值
 */
function stringToHash(str) {
  let hash = 0;
  if (str.length === 0) return hash.toString(16);
  
  for (let i = 0; i < str.length; i++) {
    const char = str.charCodeAt(i);
    hash = ((hash << 5) - hash) + char;
    hash = hash & hash; // 转换为32位整数
  }
  
  // 转换为16进制字符串并添加时间戳前缀，确保唯一性
  return 'd' + Math.abs(hash).toString(16).padStart(8, '0') + Date.now().toString(36);
} 